package park.borne;

import park.borne.impl.LcdImpl;

/**
 * <p> Afficheur:   </p>
 * Permet d'afficher des caractères en mode Texte sur 2 lignes de 16 caractères
 * Cette classe permet également de mémoriser et d'afficher un code d'accès.
 * Visualisation du code d'accès par des caractères "*"
 * <p>Copyright : Copyright (c) 2003</p>
 * @author Gilles Petot
 * @version 1.0
 */
public final class Afficheur
{
    private LcdImpl lcdImpl;
    private boolean isCursorOn = true;

    // constructeur
    public Afficheur() throws Exception
    {
	lcdImpl = new LcdImpl();
	lcdImpl.init();
    }

    public void initAfficheur()
    {
	lcdImpl.initLCD();
	setCursor(false);
    }

    public final boolean setEclairage(final boolean modif, final boolean eclaire)
    {
	if (modif) lcdImpl.setBackLight(eclaire);
	return lcdImpl.isBackLight();
    }


    public final  synchronized void affiche(final int posx, final int posy, final String message)
    {
	lcdImpl.printAt(posx, posy, message);
    }

    public  synchronized void afficheCaractere(char caractere)
    {
	lcdImpl.print(caractere);
    }


    /**
     *  Positionnement du curseur (qui peut etre invisible) en position x et y
     *  y vaut 0 (1ere ligne) ou 1 (2eme ligne)
     * @param x position x
     * @param y position y
     */
    public final  synchronized void positionCursor(final int x, final int y)
    {
	lcdImpl.setCursorAt(x, y);
    }

    /**
     * position du curseur 1ere colonne 1 ere ligne reinit
     */
    public final void home()
    {
	positionCursor(0, 0);
    }

    /**
     * effacement de l'affichage
     */
    public final synchronized void clear()
    {
	lcdImpl.initLCD();
    }

    public final synchronized void setCursor(final boolean c)
    {
	if (c != isCursorOn)
	{
	    if (c) lcdImpl.setCursor((byte)1);
	    else   lcdImpl.setCursor((byte)0);
	    isCursorOn = c;
	}
    }
    public final synchronized boolean getCursor()
    {
	return isCursorOn;
    }

    public final void kill()
    {
	lcdImpl.kill();
	lcdImpl = null;
    }

    //**************************************************************************

    char[] aff = new char[16];

    public final void afficheMessageSuperviseur( final String message)
    {
	int l = message.length();
	if (l > 0)
	{
	    for (int i = 0; i < 16; i++)
	    {
		if (i < l)
		{
		   aff[i] = message.charAt(i);
		}
		 else aff[i] = ' ';
	    }
	    affiche(0, 0, String.valueOf(aff));
	    refreshCursor();
	}
    }

    public final void afficheMessages(final String ligne1, final String ligne2)
    {
	if (ligne1.length() != 0) affiche(0, 0, ligne1);
	if (ligne2.length() != 0) affiche(0, 1, ligne2);
    }

    //**************************************************************************
    //                        gestion du code d'acces
    //**************************************************************************

    private static final String MESSAGE_CODE                = "- code :       -";
    private static final String tableCaracteresClavier = "0123456789*#abcd";
    private static final int NOMBRE_CHIFFRES_CODE = 4;
    private static final int X_POSITION_CODE = 9;
    private static final int Y_POSITION_CODE = 1;

    private char[] code = new char[NOMBRE_CHIFFRES_CODE];
    private int compteurChiffres = -1;


    public final void startModeEdit()
    {
	affiche(0, 1, MESSAGE_CODE);
	compteurChiffres = 0;
	positionCursor(X_POSITION_CODE, Y_POSITION_CODE);
	setCursor(true);
    }

    public final void stopModeEdit()
    {
	setCursor(false);
	compteurChiffres = -1;
    }

    final void refreshCursor()
    {
	if (compteurChiffres >= 0)
	{
	    positionCursor(X_POSITION_CODE + compteurChiffres, Y_POSITION_CODE);
	}
    }

    public final void doTouche(byte codeTouche)
    {
	if (codeTouche < 10)
	{
	    if (compteurChiffres < NOMBRE_CHIFFRES_CODE)
	    {
		code[compteurChiffres++] = (char)(0x030 + codeTouche);//tableCaracteresClavier.charAt((int) codeTouche);
		afficheCaractere('*');
	    }
	}
	else
	    if(codeTouche == 10)
	    {
		if (compteurChiffres > 0)
		{
		    compteurChiffres--;
		    positionCursor(X_POSITION_CODE + compteurChiffres, Y_POSITION_CODE);
		    afficheCaractere(' ');
		    positionCursor(X_POSITION_CODE + compteurChiffres, Y_POSITION_CODE);
		}
	    }
    }

    public final boolean isCodeAccesComplet()
    {
	return compteurChiffres == NOMBRE_CHIFFRES_CODE;
    }

    public final String getCodeClavier()
    {
	return String.valueOf(code);
    }

}